package com.example.config;



import java.nio.charset.Charset;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.JSONLibDataFormatSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.ValueFilter;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.StringHttpMessageConverter;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;

///**
// * 添加fastjson的转换
// */
//@Configuration
//public class FastJSON_Config {
//    final static String _DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
//
//    @Bean
//    public HttpMessageConverters customConverters() {
//        // 定义一个转换消息的对象
//        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//        // 添加fastjson的配置信息 比如 ：是否要格式化返回的json数据
//        FastJsonConfig fastJsonConfig = new FastJsonConfig();
//        // 这里就是核心代码了，WriteMapNullValue把空的值的key也返回
//        fastJsonConfig.setSerializerFeatures(
//                //保留map空的字段
//                SerializerFeature.WriteMapNullValue,
//                // 将String类型的NULL转化为""
//                SerializerFeature.WriteNullStringAsEmpty,
//                // 将Number类型的NULL转化为0
//                SerializerFeature.WriteNullNumberAsZero,
//                // 将List类型的NULL转成[]
//                SerializerFeature.WriteNullListAsEmpty,
//                // 将Boolean类型的NULL转化为false
//                SerializerFeature.WriteNullBooleanAsFalse,
//                // 避免循环引用
//                SerializerFeature.DisableCircularReferenceDetect);
//
//        //如果时间类型值为null，则返回空串
//        ValueFilter dateFilter = (Object var1, String var2, Object var3) -> {
//            try {
//                if (var3 == null && var1 != null && Date.class.isAssignableFrom(var1.getClass().getDeclaredField(var2).getType())) {
//                    return "";
//                }
//            } catch (Exception e) {
//            }
//            return var3;
//        };
//        fastJsonConfig.setSerializeFilters(dateFilter);
//
//        fastJsonConfig.setDateFormat(_DATE_FORMAT);
//
//        List<MediaType> fastMediaTypes = new ArrayList<MediaType>();
//
//        // 处理中文乱码问题
//        fastJsonConfig.setCharset(Charset.forName("UTF-8"));
//        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
//        fastConverter.setSupportedMediaTypes(fastMediaTypes);
//        // 在转换器中添加配置信息
//        fastConverter.setFastJsonConfig(fastJsonConfig);
//
//        StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
//        stringConverter.setDefaultCharset(Charset.forName("UTF-8"));
//        stringConverter.setSupportedMediaTypes(fastMediaTypes);
//        // 将转换器添加到converters中
//        return new HttpMessageConverters(stringConverter, fastConverter);
//    }
//}

public class FastJSON_Config {

    private static final SerializeConfig config;

    static {

        config = new SerializeConfig();

        config.put(java.util.Date.class, new JSONLibDataFormatSerializer()); // 使用和json-lib兼容的日期输出格式

        config.put(java.sql.Date.class, new JSONLibDataFormatSerializer()); // 使用和json-lib兼容的日期输出格式

    }

    /**
     * 输出json字符串的属性要求，如果方法中未加入此属性则json格式按照默认的格式输出
     */
    private static final SerializerFeature[] features = {

            // 输出空置字段
            SerializerFeature.WriteMapNullValue,

            // list字段如果为null，输出为[]，而不是null
            SerializerFeature.WriteNullListAsEmpty,

            // 数值字段如果为null，输出为0，而不是null
            SerializerFeature.WriteNullNumberAsZero,

            // Boolean字段如果为null，输出为false，而不是null
            SerializerFeature.WriteNullBooleanAsFalse,

            // 字符类型字段如果为null，输出为""，而不是null
            SerializerFeature.WriteNullStringAsEmpty,

            // 禁止循环引用
            SerializerFeature.DisableCircularReferenceDetect,

    };

    /**
     *
     * @Function: FastJsonUtils.java
     * @Description: object转json
     * @version: v1.0.0
     * @date: 2018年9月11日 上午9:12:53
     */

    public static String objectToJSON(Object obj) {
        return JSON.toJSONString(obj, config, features);
    }

    /**
     *
     * @Function: FastJsonUtils.java
     * @Description: object转json不带Features
     * @version: v1.0.0
     * @date: 2018年9月11日 上午9:13:22
     */
    public static String toJSONNoFeatures(Object obj) {

        return JSON.toJSONString(obj, config);

    }

    /**
     *
     * @Function: FastJsonUtils.java
     * @Description: json转object
     * @version: v1.0.0
     * @date: 2018年9月11日 上午9:12:25
     */
    public static Object stringToBean(String text) {

        return JSON.parse(text);

    }

    /**
     * json转泛类
     * @param text
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T stringToBean(String text, Class<T> clazz) {

        return JSON.parseObject(text, clazz);

    }

    /**
     *
     * @Function: FastJsonUtils.java
     * @Description: json转object数组
     * @version: v1.0.0
     * @date: 2018年9月11日 上午9:15:57
     */
    public static <T> Object[] toArray(String text) {

        return toArray(text, null);

    }

    /**
     *
     * @Function: FastJsonUtils.java
     * @Description: json转泛数组
     * @version: v1.0.0
     * @date: 2018年9月11日 上午9:15:52
     */
    public static <T> Object[] toArray(String text, Class<T> clazz) {

        return JSON.parseArray(text, clazz).toArray();

    }

    /**
     *
     * @Function: FastJsonUtils.java
     * @Description: json转list
     * @version: v1.0.0
     * @date: 2018年9月11日 上午9:15:47
     */
    public static <T> List<T> toList(String text, Class<T> clazz) {

        return JSON.parseArray(text, clazz);

    }





    /**
     *
     * @Function: FastJsonUtils.java
     * @Description: 字符串转map
     * @version: v1.0.0
     * @date: 2018年9月11日 上午9:17:19
     */
    public static <K, V> Map<K, V> stringToCollect(String s) {

        Map<K, V> m = (Map<K, V>) JSONObject.parseObject(s);

        return m;

    }


    /**
     *
     * @Function: FastJsonUtils.java
     * @Description: 该函数的功能描述
     * @version: v1.0.0
     * @date: 2018年9月11日 上午9:18:06
     */
    public static Object convertJsonToObject(String jsonData, Class<?> clazz) {

        return JSONObject.parseObject(jsonData, clazz);

    }

    public static Object convertJSONToObject(String content, Class<?> clazz) {

        return JSONObject.parseObject(content, clazz);

    }

    /**
     *
     * @Function: FastJsonUtils.java
     * @Description: 该函数的功能描述
     * @version: v1.0.0
     * @date: 2018年9月11日 上午9:18:47
     */

    public static <K, V> String collectToString(Map<K, V> m) {

        String s = JSONObject.toJSONString(m);

        return s;

    }

    public static <T> T stringToBean(String content, TypeReference<T> typeReference) {

        return JSONObject.parseObject(content, typeReference);

    }

    public static  String getString(String json,String key){
        return  JSON.parseObject(json).getString(key);
    }
}
